package data

import (
	"io"
	"log"
	"time"

	"github.com/sirupsen/logrus"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	gormLoggerPkg "gorm.io/gorm/logger"
)

// Vsys 数据库模型，映射虚拟系统表
type Vsys struct {
	ID          int         `gorm:"primaryKey" json:"id"`
	Name        string      `json:"name"`
	Description string      `json:"description"`
	Interfaces  StringArray `json:"interfaces" gorm:"type:text"`
	CreatedAt   time.Time   `json:"createdAt"`
	UpdatedAt   time.Time   `json:"updatedAt"`
}

// 全局数据库连接句柄
var VsysDB *gorm.DB

/////////////////////////////////////////主API///////////////////

// CreateVsys 新增虚拟系统
func CreateVsys(vsys *Vsys) error {
	return VsysDB.Create(vsys).Error
}

// DeleteVsys 删除虚拟系统，并删除所有属于该虚拟系统的策略
func DeleteVsys(id int) error {
	// 先删除所有属于该虚拟系统的策略
	if err := PolicyDB.Where("vsys_id = ?", id).Delete(&Policy{}).Error; err != nil {
		return err
	}
	// 再删除虚拟系统本身
	return VsysDB.Delete(&Vsys{}, id).Error
}

// UpdateVsys 更新虚拟系统
func UpdateVsys(vsys *Vsys) error {
	return VsysDB.Save(vsys).Error
}

// GetVsysByID 查询单条虚拟系统
func GetVsysByID(id int) (*Vsys, error) {
	var vsys Vsys
	err := VsysDB.First(&vsys, id).Error
	return &vsys, err
}

// ListVsys 查询虚拟系统列表（分页+模糊查询）
func ListVsys(pageSize, pageNum int, name string) ([]Vsys, int64, error) {
	var list []Vsys
	var total int64
	query := VsysDB.Model(&Vsys{})
	if name != "" {
		query = query.Where("name LIKE ?", "%"+name+"%")
	}
	query.Count(&total)
	err := query.Offset((pageNum - 1) * pageSize).Limit(pageSize).Find(&list).Error
	return list, total, err
}

// //////	/////////////////////////判断冲突API////////////////////////
// 检查名字是否冲突
func IsVsysNameConflict(name string) (bool, error) {
	//对象是否存在
	var res Vsys
	err := VsysDB.Where("name = ?", name).First(&res).Error
	if err == gorm.ErrRecordNotFound {
		return false, nil // 不冲突
	}
	if err != nil {
		return false, err // 查询出错
	}
	return true, nil // 冲突
}

// /////////////////////////////初始化数据库///////////////////////////
// 初始化数据库
func InitVsysDB(filename string) error {
	var err error
	// 自定义 GORM Logger: 忽略 record not found, 仅打印真正的 Warn/Error (去掉彩色, 不输出到控制台)
	gormLogger := gormLoggerPkg.New(log.New(io.Discard, "", log.LstdFlags), gormLoggerPkg.Config{
		SlowThreshold:             0,
		Colorful:                  false,
		IgnoreRecordNotFoundError: true,               // 关键: 忽略 record not found
		LogLevel:                  gormLoggerPkg.Warn, // 需要最少输出可调成 Error 或 Silent
	})
	VsysDB, err = gorm.Open(sqlite.Open(filename), &gorm.Config{Logger: gormLogger})
	if err != nil {
		return err
	}
	err = VsysDB.AutoMigrate(&Vsys{})
	if err != nil {
		logrus.Errorf("创建%v表失败!", "Vsys")
	} else {
		logrus.Infof("创建%v表成功!", "Vsys")
	}
	return nil
}
